/**
 * 封装 axios 请求模块
 */
import axios from 'axios'
import store from '@/store/index'
import JSONBig from 'json-bigint'
import router from '@/router'
const request = axios.create({
  baseURL: 'http://toutiao.itheima.net',
  // baseURL: 'http://192.168.17.40:8000/api.html'
  // baseURL: 'http://192.168.17.27:8000/'
  // `transformResponse` 在传递给 then/catch 前，允许修改响应数据
  transformResponse: [function(data) {
    // 对 data 进行任意转换处理
    try {
      return JSONBig.parse(data)
    } catch (error) {
      return data
    }
  }]
})
// const jsonStr = '{ "art_id": 1245953273786007552 }'
// console.log(JSON.parse(jsonStr))
// console.log(JSONBig.parse(jsonStr))
// console.log(JSONBig.parse(jsonStr).art_id.toString())
// 配置请求拦截器
request.interceptors.request.use(config => {
  // 在发送请求之前做些什么
  const { user } = store.state
  if (user && user.token) {
    config.headers.Authorization = `Bearer ${user.token}`
  }
  // console.log(config);
  return config
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error)
})
// 添加响应拦截器
// request.interceptors.response.use(function(response) {
//   // 对响应数据做点什么
//   return response
// }, function(error) {
//   // 对响应的错误做点上面
//   if (error.response && error.response.status === 401) {
//     return router.push('/login')
//   }
//   return Promise.reject(error)
// })

request.interceptors.response.use(
  // 响应成功进入第1个函数
  // 该函数的参数是响应对象
  function(response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    return response
  },
  // 响应失败进入第2个函数，该函数的参数是错误对象
  async function(error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error
    // 如果响应码是 401 ，则请求获取新的 token

    // 响应拦截器中的 error 就是那个响应的错误对象
    console.dir(error)
    if (error.response && error.response.status === 401) {
      // 校验是否有 refresh_token
      const user = store.state.user

      if (!user || !user.refresh_token) {
        router.push('/login')

        // 代码不要往后执行了
        return
      }

      // 如果有refresh_token，则请求获取新的 token
      try {
        const res = await axios({
          method: 'PUT',
          url: 'http://toutiao.itheima.net/v1_0/authorizations',
          headers: {
            Authorization: `Bearer ${user.refresh_token}`
          }
        })

        // 如果获取成功，则把新的 token 更新到容器中
        console.log('刷新 token  成功', res)
        store.commit('setUser', {
          token: res.data.data.token, // 最新获取的可用 token
          refresh_token: user.refresh_token // 还是原来的 refresh_token
        })

        // 把之前失败的用户请求继续发出去
        // config 是一个对象，其中包含本次失败请求相关的那些配置信息，例如 url、method 都有
        // return 把 request 的请求结果继续返回给发请求的具体位置
        return request(error.config)
      } catch (err) {
        // 如果获取失败，直接跳转 登录页
        console.log('请求刷线 token 失败', err)
        router.push('/login')
      }
    }

    return Promise.reject(error)
  }
)

// 导出请求实列对象
export default request
